home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / CMPDIRS.M < prev    next >
Encoding:
Text File  |  1993-05-13  |  7.6 KB  |  291 lines

  1. MODULE CmpDirs; (*$E MTP *)
  2.  
  3. IMPORT GEMDOSIO;
  4.  
  5. FROM Clock IMPORT Time, Date, UnpackTime, UnpackDate;
  6.  
  7. FROM SysUtil0 IMPORT VarEqual;
  8.  
  9. FROM ArgCV IMPORT PtrArgStr, InitArgCV;
  10.  
  11. FROM InOut IMPORT Write, WriteLn, WriteString, WriteInt, Read, ReadString;
  12.  
  13. FROM Files IMPORT File, Access, Open, Close, State;
  14.  
  15. FROM Binary IMPORT FileSize, ReadBytes;
  16.  
  17. FROM Directory IMPORT DirQuery, DirEntry, subdirAttr, archiveAttr, FileAttrSet;
  18.  
  19. FROM Strings IMPORT StrEqual, String, Empty, Append, Assign, Length, Space,
  20.         Upper, Concat;
  21.  
  22. FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD, ASSEMBLER;
  23.  
  24. VAR subdirs, ok: BOOLEAN;
  25.     c: CHAR;
  26.     res: INTEGER;
  27.     destpath: String;
  28.  
  29. PROCEDURE missing (s: ARRAY OF CHAR; dir: BOOLEAN);
  30.   BEGIN
  31.     WriteLn;
  32.     WriteString (s);
  33.     IF dir THEN
  34.       WriteString (Space (40-Length(s)));
  35.       WriteString (' <DIR>')
  36.     END;
  37.   END missing;
  38.  
  39. PROCEDURE GetDirEntry ( fileName: ARRAY OF CHAR;
  40.                         VAR entry: DirEntry; VAR found: BOOLEAN );
  41.   (*
  42.    * Liefert die Directory-Daten einer Datei.
  43.    * Existiert die Datei nicht auf dem angegebenen Pfad oder ist der
  44.    * angegebene Name ein Unterverzeichnis oder ein Volume-Label,
  45.    * liefert 'found' FALSE.
  46.    *)
  47.  
  48.   (*$L-*)
  49.   
  50.   PROCEDURE str0;
  51.     BEGIN
  52.       ASSEMBLER
  53.         ; D0: HIGH (s)
  54.         ; A0: ADR (s)
  55.         ; D2 erhalten !
  56.         MOVE.L  (A7)+,A1
  57.         
  58.         MOVE    D0,D1
  59.         ADDQ    #3,D1
  60.         BCLR    #0,D1
  61.         
  62.         ; LINK:
  63.         PEA     (A5)
  64.         MOVE.L  A7,A5
  65.         SUBA.W  D1,A7
  66.         
  67.         CMPA.L  A3,A7
  68.         BLS     E
  69.         MOVE.L  A7,A2
  70.         
  71.      L: MOVE.B  (A0)+,(A2)+
  72.         DBRA    D0,L
  73.         CLR.B   (A2)+
  74.         
  75.         MOVE.L  A7,D0
  76.         JMP     (A1)
  77.      
  78.      E: TRAP    #6      ; OUT OF STACK
  79.         DC.W    -10
  80.       END
  81.     END str0;
  82.  
  83.   PROCEDURE setDta;
  84.     BEGIN
  85.       ASSEMBLER
  86.         ; get old DTA
  87.         MOVE    #$2F,-(A7)
  88.         TRAP    #1
  89.         MOVE.L  D0,D3           ; alten DTA merken in D3
  90.         ; set new DTA
  91.         MOVE.L  D4,-(A7)
  92.         MOVE    #$1A,-(A7)
  93.         TRAP    #1
  94.         ADDQ.L  #8,A7
  95.       END
  96.     END setDta;
  97.  
  98.   PROCEDURE rstDta;
  99.     BEGIN
  100.       ASSEMBLER
  101.         ; reset old DTA, erhalte D0 !
  102.         MOVE.L  D0,-(A7)
  103.         MOVE.L  D3,-(A7)
  104.         MOVE    #$1A,-(A7)
  105.         TRAP    #1
  106.         ADDQ.L  #6,A7
  107.         MOVE.L  (A7)+,D0
  108.       END
  109.     END rstDta;
  110.  
  111.   BEGIN
  112.     ASSEMBLER
  113.         MOVE.L  -14(A3),A0
  114.         MOVE.W  -10(A3),D0
  115.         BSR     str0
  116.         
  117.         MOVEM.L D3/D4,-(A7)
  118.         
  119.         ; DTA anlegen
  120.         SUBA.W  #44,A7
  121.         MOVE.L  A7,D4
  122.         
  123.         CLR.W   -(A7)           ; Attribut
  124.         MOVE.L  D0,-(A7)        ; zuerst D0 (^name) sichern
  125.         BSR     setDta          ; dann DTA sichern/umsetzen
  126.         MOVE    #$4E,-(A7)
  127.         TRAP    #1              ; FSFIRST
  128.         ADDQ.L  #8,A7
  129.         BSR     rstDta
  130.         
  131.         MOVE.L  -8(A3),A1       ; ADR (entry)
  132.         
  133.         ; Name in Dir vorhanden ?
  134.         TST.L   D0
  135.         BMI     fals
  136.         
  137.         ; Prüfen, ob es ein normales File ist (nicht Subdir/volID)
  138.         MOVE.B  21(A7),D0
  139.         ANDI    #11000%,D0
  140.         BNE     fals
  141.         
  142.         ; DirEntry kopieren, DTA ist direkt auf dem Systemstack
  143.         ; name
  144.         MOVEQ   #5,D0
  145.         LEA     $1E(A7),A0
  146.     L0: MOVE.W  (A0)+,(A1)+
  147.         DBRA    D0,L0
  148.         ; attr
  149.         MOVE.B  21(A7),(A1)+
  150.         CLR.B   (A1)+
  151.         ; time
  152.         MOVE    22(A7),(A3)+
  153.         MOVE.L  A1,-(A7)
  154.         JSR     UnpackTime
  155.         MOVE.L  (A7)+,A1
  156.         MOVE.L  -6(A3),(A1)+
  157.         MOVE.W  -(A3),(A1)+
  158.         SUBQ.L  #4,A3
  159.         ; date
  160.         MOVE    24(A7),(A3)+
  161.         MOVE.L  A1,-(A7)
  162.         JSR     UnpackDate
  163.         MOVE.L  (A7)+,A1
  164.         MOVE.L  -6(A3),(A1)+
  165.         MOVE.W  -(A3),(A1)+
  166.         SUBQ.L  #4,A3
  167.         ; size
  168.         MOVE.L  26(A7),(A1)+
  169.         MOVEQ   #1,D0
  170.         BRA     ende
  171.         
  172.       fals
  173.         ; entry löschen
  174.         MOVEQ   #14,D0
  175.     l1: CLR.W   (A1)+
  176.         DBRA    D0,l1
  177.         MOVEQ   #0,D0
  178.         
  179.       ende
  180.         MOVE.L  -(A3),A0        ; ok
  181.         MOVE    D0,(A0)
  182.         
  183.         SUBA.W  #10,A3          ; name + entry
  184.         ADDA.W  #44,A7
  185.         MOVEM.L (A7)+,D3/D4
  186.         UNLK    A5
  187.     END
  188.   END GetDirEntry;
  189.   (*$L=*)
  190.  
  191. PROCEDURE checkFile (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  192.  
  193.   VAR dest: String; f: File; destentry: DirEntry;
  194.  
  195.   BEGIN
  196.     Concat (destpath, entry.name, dest, ok);
  197.     GetDirEntry (dest, destentry, ok);
  198.     IF NOT ok
  199.     OR ((destentry.attr-FileAttrSet{archiveAttr}) # (entry.attr-FileAttrSet{archiveAttr}))
  200.     OR NOT VarEqual (destentry.time, entry.time)
  201.     OR NOT VarEqual (destentry.date, entry.date)
  202.     OR (destentry.size # entry.size)
  203.     OR NOT StrEqual (destentry.name, entry.name) THEN
  204.       Concat (path, entry.name, dest, ok);
  205.       missing (dest, FALSE)
  206.     END;
  207.     RETURN TRUE
  208.   END checkFile;
  209.  
  210. PROCEDURE checkDDir (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  211.  
  212.   BEGIN
  213.     RETURN FALSE
  214.   END checkDDir;
  215.  
  216. PROCEDURE checkDir (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  217.  
  218.   VAR lastpath, dest, source: String;
  219.  
  220.   BEGIN
  221.     IF subdirAttr IN entry.attr THEN
  222.       IF entry.name[0] # '.' THEN
  223.         Concat (path, entry.name, source, ok);
  224.         (*
  225.           WriteLn;
  226.           WriteString ('// Path ');
  227.           WriteString (source);
  228.         *)
  229.         Append ('\', source, ok);
  230.         lastpath:= destpath;
  231.         Append (entry.name, destpath, ok);
  232.         Append ('\', destpath, ok);
  233.         Concat (destpath, '*.*', dest, ok);
  234.         DirQuery (dest, FileAttrSet {}, checkDDir, res);
  235.         IF (res < 0) AND (res # -33) THEN
  236.           missing (source, TRUE);
  237.         ELSE
  238.           Append ('*.*', source, ok);
  239.           DirQuery (source, FileAttrSet {}, checkFile, res);
  240.           DirQuery (source, FileAttrSet {subdirAttr}, checkDir, res);
  241.           IF res < 0 THEN
  242.             HALT
  243.           END
  244.         END;
  245.         destpath:= lastpath;
  246.       END
  247.     END;
  248.     RETURN TRUE
  249.   END checkDir;
  250.  
  251.  
  252. VAR     argv: ARRAY [0..3] OF PtrArgStr;
  253.         argc: CARDINAL;
  254.         n1: String;
  255.         ch: CHAR;
  256.  
  257. BEGIN
  258.   InitArgCV ( argc, argv );
  259.   IF argc > 2 THEN
  260.     Assign (argv[1]^, n1, ok);
  261.     Assign (argv[2]^, destpath, ok);
  262.     subdirs:= argc > 3
  263.   ELSE
  264.     WriteString ('First folder  ? ');
  265.     ReadString (n1);
  266.     IF Empty (n1) THEN RETURN END;
  267.     WriteString ('Second folder ? ');
  268.     ReadString (destpath);
  269.     IF Empty (destpath) THEN RETURN END;
  270.   END;
  271.   
  272.   Upper (n1);
  273.   Upper (destpath);
  274.   (*
  275.   WriteString ('// Path ');
  276.   WriteString (n1);
  277.   *)
  278.   Append ('*.*', n1, ok);
  279.   DirQuery (n1, FileAttrSet {}, checkFile, res);
  280.   DirQuery (n1, FileAttrSet {subdirAttr}, checkDir, res);
  281.   IF res < 0 THEN
  282.     WriteLn;
  283.     WriteString ('Error #');
  284.     WriteInt (res,0)
  285.   END;
  286.   
  287.   WriteLn;
  288. END CmpDirs.
  289. ə
  290. (* $FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$000012A9$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3AÇ$0000129DT.......T.......T.......T.......T.......T..T....T.......T.......T.......T.......$000012D2$000012A9$0000129D$000012D0$000012C5$00001363$000013C8$0000025F$00000528$0000026B$FFF2F840$00000098$00001282$000012AE$000001AC$000012AAöÇÇ*)
  291.